// 这是一个通用的并发请求控制，可以限制同一时刻的最大并发数

type RequestTask = () => Promise<unknown>;

// 并发控制器类
export class ConcurrentRequestController {
    // 最大并发数
    private maxConcurrent: number;
    // 当前正在进行的请求数据
    private currentCount: number = 0;
    // 请求队列
    private queue: Array<() => void> = [];

    constructor(maxConcurrent: number) {
        this.maxConcurrent = maxConcurrent;
    }

    // 添加一个请求任务
    add(task: RequestTask): Promise<unknown> {
        return new Promise((resolve, reject) => {
            // 包装任务，确保 resolve/reject 能正确传递
            const runTask = () => {
                this.currentCount++;
                task()
                    .then(resolve)
                    .catch(reject)
                    .finally(() => {
                        this.currentCount--;
                        // 执行一下队列中的任务
                        if (this.queue.length > 0) {
                            const nextTask = this.queue.shift();
                            if (nextTask) nextTask();
                        }
                    });
            };

            // 如果未达到最大并发数，直接执行
            if (this.currentCount < this.maxConcurrent) {
                runTask();
            } else {
                // 否则加入队列
                this.queue.push(runTask);
            }
        })
    }
}